home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / stterm / do_shell.c < prev    next >
C/C++ Source or Header  |  1990-07-15  |  2KB  |  75 lines

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <sgtty.h>
  4. #include <stdlib.h>
  5.  
  6. extern char **envptr;
  7. static char *shellp = (char *)NULL;
  8.  
  9. void do_shell()
  10. {
  11.     register int pid, wpid;
  12.     register void (*oqsig)(), (*oisig)(), (*otsig)();
  13.     register int fd = fileno(stdin);
  14.     register int ofd;
  15.     int    status;
  16.     struct sgttyb con, con_save;
  17.     
  18.     if (shellp == (char *)NULL)
  19.     {
  20.     shellp = getenv("SHELL");
  21.     if (shellp == (char *)NULL)
  22.         shellp = "/bin/sh";
  23.     }
  24.  
  25.     if(ioctl(fd, TIOCGETP, &con) == EOF)
  26.     {
  27.     perror("console");
  28.     return;
  29.     }
  30.     if((ofd = open("/dev/tty", 1)) < 0)
  31.     {
  32.     perror("console stdout");
  33.     return;
  34.     }
  35.     
  36.     con_save = con;
  37.     con.sg_flags &= ~RAW;
  38.     con.sg_flags |= ECHO;
  39.     if(ioctl(fd, TIOCSETP, &con) == EOF)
  40.     {
  41.     perror("console");
  42.     close(ofd);
  43.     return;
  44.     }
  45.     
  46.     oqsig = signal(SIGQUIT, SIG_IGN);
  47.     oisig = signal(SIGINT,  SIG_IGN);
  48.     otsig = signal(SIGTERM,  SIG_IGN);
  49.     if ((pid=fork()) < 0)
  50.     {
  51.     (void) signal(SIGQUIT, oqsig);    
  52.     (void) signal(SIGINT,  oisig);
  53.     (void) signal(SIGTERM, otsig);
  54.     (void)ioctl(fd, TIOCSETP, &con_save);
  55.     close(ofd);
  56.     fprintf(stderr, "Failed to create process");
  57.     return;
  58.     }
  59.     if (pid == 0)
  60.     {
  61.     /* stdout is comm line, re-dir to console */
  62.     close(fileno(stdout));
  63.     dup(ofd);
  64.     execle(shellp, "sh", "-i", (char *)NULL, envptr);
  65.     exit(0);        /* Should do better!    */
  66.     }
  67.     while ((wpid=wait(&status))>=0 && wpid!=pid)
  68.     ;
  69.     (void) signal(SIGQUIT, oqsig);
  70.     (void) signal(SIGINT,  oisig);
  71.     (void) signal(SIGTERM, otsig);
  72.     close(ofd);
  73.     (void)ioctl(fd, TIOCSETP, &con_save);
  74. }
  75.